From 7dd0f3829cba1db6aff18090e1185d1fe5553e95 Mon Sep 17 00:00:00 2001 From: Zizhuan Liu <44973863@qq.com> Date: Wed, 17 Jun 2026 18:29:52 +0800 Subject: [PATCH v2] Improving psql autocompletion for SET LOCAL / SET SESSION v2 --- src/bin/psql/tab-complete.in.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c index de547a8c..47b842c6 100644 --- a/src/bin/psql/tab-complete.in.c +++ b/src/bin/psql/tab-complete.in.c @@ -1243,6 +1243,10 @@ Copy_common_options, "DEFAULT", "FORCE_NOT_NULL", "FORCE_NULL", "FREEZE", \ #define Copy_to_options \ Copy_common_options, "FORCE_QUOTE", "FORCE_ARRAY" +/* SET special parameters */ +#define Set_special_parameters \ +"SCHEMA", "NAMES", "SEED", "TIME ZONE" + /* * These object types were introduced later than our support cutoff of * server version 9.2. We use the VersionedQuery infrastructure so that @@ -5280,16 +5284,21 @@ match_previous_words(int pattern_id, /* SET, RESET, SHOW */ /* Complete with a variable name */ - else if (TailMatches("SET|RESET") && - !TailMatches("UPDATE", MatchAny, "SET") && + else if (TailMatches("RESET") && !TailMatches("ALTER", "DATABASE|USER|ROLE", MatchAny, "RESET")) + COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars, + "ALL"); + else if (TailMatches("SET") && + !TailMatches("UPDATE", MatchAny, "SET")) COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars, "CONSTRAINTS", "TRANSACTION", "SESSION", "ROLE", "TABLESPACE", - "ALL"); + "LOCAL", + "SESSION", + Set_special_parameters); else if (Matches("SHOW")) COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_show_vars, "SESSION AUTHORIZATION", @@ -5335,12 +5344,19 @@ match_previous_words(int pattern_id, /* Complete SET CONSTRAINTS with DEFERRED|IMMEDIATE */ else if (Matches("SET", "CONSTRAINTS", MatchAny)) COMPLETE_WITH("DEFERRED", "IMMEDIATE"); + /* Complete SET LOCAL with a variable name */ + else if (Matches("SET", "LOCAL")) + COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars, + Set_special_parameters); /* Complete SET ROLE */ else if (Matches("SET", "ROLE")) COMPLETE_WITH_QUERY(Query_for_list_of_roles); - /* Complete SET SESSION with AUTHORIZATION or CHARACTERISTICS... */ + /* Complete SET SESSION with a variable name */ else if (Matches("SET", "SESSION")) - COMPLETE_WITH("AUTHORIZATION", "CHARACTERISTICS AS TRANSACTION"); + COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars, + Set_special_parameters, + "AUTHORIZATION", + "CHARACTERISTICS AS TRANSACTION"); /* Complete SET SESSION AUTHORIZATION with username */ else if (Matches("SET", "SESSION", "AUTHORIZATION")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, -- 2.43.0